#ifndef PROCESS_STRUCT_H
#define PROCESS_STRUCT_H

#include <stdint.h>
#include <time.h>

// CPU 上下文结构体
typedef struct {
    uint32_t eax, ebx, ecx, edx;  // 通用寄存器
    uint32_t esi, edi, ebp, esp;  // 指针寄存器
    uint32_t eip;                // 指令指针寄存器 (PC)
    uint32_t eflags;             // 标志寄存器（PSW）
} CPUContext;

// 虚拟内存区域 (virtual memory area， 简称 vma)
typedef struct {
    // 虚拟内存区域起始虚拟地址（包含）
    unsigned long vm_start;
    // 虚拟内存区域结束虚拟地址（不包含）
    // 即区域范围为 [vm_start, vm_end)
    unsigned long vm_end;

    // 访问权限与属性标识
    unsigned long vm_flags;

    // 用于将 VMA 链接成双向链表的指针
    struct vm_area_struct *vm_next, *vm_prev;

    // 文件索引结点
    struct inode *i_node;
    // 文件偏移量
    long offset;

} vm_area_struct;

// 内管管理结构（管理进程的虚拟内存）
typedef struct {
    // 虚拟内存空间范围
    // 只读代码段的起始和结束虚拟地址
    unsigned long start_code, end_code;
    // 读写数据段的起始和结束虚拟地址
    unsigned long start_data, end_data;
    // 运行时堆的起始和结束虚拟地址
    unsigned long start_brk, brk;
    // 用户栈的起始虚拟地址（栈从高地址向低地址增长)
    unsigned long start_stack;

    // 指向 vma 双向链表的第一个 vma
    vm_area_struct *mmap;

    // 页表的基地址（物理地址）
    unsigned long PTBA;
} mm_struct;

// 文件描述符表项
typedef struct {
    int fd;                   // 文件描述符编号
    int mode;                 // 打开模式（读/写/追加）
    // 其他文件相关信息
} FileDescriptor;

// 进程状态枚举
typedef enum {
    NEW,           // 新建，进程正在创建
    READY,         // 就绪，进程等待分配 CPU 的时间片
    RUNNING,       // 运行，CPU 正在执行进程的指令
    WAITING,       // 等待或者称为阻塞，进程等待发生某个事件（比如 I/O 完成或者收到信号）
    TERMINATED     // 终止，进程已经完成执行
} ProcessState;

// 进程控制块（Process Control Block）结构体
// 在 Linux 中，我们将 PCB 称为 task_struct
typedef struct {
    char *pname;  // 进程名
    PCB *parent;    // 父进程
    list_head children;  // 所有的子进程
    CPUContext context;  // CPU 上下文
    mm_struct *mm;     // 虚拟内存管理
    FileDescriptor files[10]; // 文件描述符表
    void *stack; // 内核栈

    // 信号处理结构相关

    ProcessState state;       // 进程状态

    // 其他进程相关信息
} PCB;

#endif // PROCESS_STRUCT_H    